#ifndef __ACTIVATION_H__
#define __ACTIVATION_H__

#include <cmath>

#include "../Eigen/Dense"

// #define FAST_SIGMOID

namespace activation {
inline float relu(float x) { return x > 0.0f ? x : 0.0f; };

void relu(Eigen::VectorXf& src, Eigen::VectorXf& dst)
{
    float* src_data = src.data();
    float* dst_data = dst.data();
    for (int i = 0; i < src.size(); i++) {
        dst_data[i] = relu(src_data[i]);
    }
}

void tanh(Eigen::VectorXf& src, Eigen::VectorXf& dst)
{
    float* src_data = src.data();
    float* dst_data = dst.data();
    for (int i = 0; i < src.size(); i++) {
        dst_data[i] = tanhf(src_data[i]);
    }
}

inline float sigmoid(float x)
{
#ifdef FAST_SIGMOID
    return 0.5f * (fast_tanh(x * 0.5f) + 1.0f);
#else
    return 1.0f / (1.0f + expf(-x));
#endif
};

void sigmoid(Eigen::VectorXf& src, Eigen::VectorXf& dst)
{
    float* src_data = src.data();
    float* dst_data = dst.data();
    for (int i = 0; i < src.size(); i++) {
        dst_data[i] = sigmoid(src_data[i]);
    }
}
} // namespace activation

#endif